home *** CD-ROM | disk | FTP | other *** search
/ Programming Microsoft Visual Basic .NET / Programming Microsoft Visual Basic .NET (Microsoft Press)(X08-78517)(2002).bin / 21 adonet disconnected / adonetdisconnected / dbindependentcode.vb < prev    next >
Text File  |  2002-03-16  |  6KB  |  143 lines

  1. Imports System.Data
  2. Imports System.Data.OleDb
  3. Imports System.Data.SqlClient
  4. Imports System.Data.Common
  5.  
  6. ' this module contains examples of how you can write
  7. ' database independent code - to see it in action you must
  8. ' make Main the startup routine for this project
  9.  
  10. Module DBIndependentCode
  11.     Sub Main()
  12.         ExampleCode()
  13.     End Sub
  14.  
  15.     Sub ExampleCode()
  16.         ' Start with the connection string.
  17.         Dim connStr As String = BiblioConnString
  18.         ' Uncomment next line to check that it works also with the SQL provider.
  19.         connStr = SqlPubsConnString
  20.  
  21.         ' Create a connection object, assign to a generic IDbConnection variable.
  22.         Dim cn As IDbConnection = CreateConnection(connStr)
  23.         cn.Open()
  24.         ' Create a command on this connection.
  25.         Dim cmd As IDbCommand = cn.CreateCommand
  26.         ' In this case the CommandText must be assigned separatedly.
  27.         cmd.CommandText = "SELECT * FROM Publishers"
  28.         ' Get a DataReader object.
  29.         Dim dr As IDataReader = cmd.ExecuteReader
  30.  
  31.         ' Write field values and close the DataReader.
  32.         Do While dr.Read And False
  33.             Dim i As Integer
  34.             For i = 0 To dr.FieldCount - 1
  35.                 Debug.Write(dr(i))
  36.             Next
  37.             Debug.WriteLine("")
  38.         Loop
  39.         dr.Close()
  40.  
  41.         ' Open a transaction.
  42.         Dim tr As IDbTransaction = cn.BeginTransaction
  43.         Try
  44.             ' perform your database task here.
  45.             ' ...
  46.         Catch ex As Exception
  47.             ' Rollback everything in case of error.
  48.             tr.Rollback()
  49.             tr = Nothing
  50.         Finally
  51.             ' if the transaction is still active, commit it.
  52.             If Not (tr Is Nothing) Then tr.Commit()
  53.         End Try
  54.  
  55.         ' Create a DataAdapter in a database-agnostic way
  56.         Dim da As DbDataAdapter = CreateDataAdapter("SELECT * FROM Titles", cn)
  57.         Dim ds As New DataSet()
  58.         da.Fill(ds, "Titles")
  59.  
  60.         ' Change a field (without changing anything)
  61.         ds.Tables("Titles").Rows(0)(1) = ds.Tables("Titles").Rows(0)(1).ToString & "*"
  62.  
  63.         ' Dynamically add an event to the DataAdapter.
  64.         AddHandlerByName(da, "RowUpdated", New OleDbRowUpdatedEventHandler(AddressOf OnOleDbRowUpdated), New SqlRowUpdatedEventHandler(AddressOf OnSqlRowUpdated))
  65.         ' Update the data source.
  66.         da.Update(ds, "Titles")
  67.  
  68.         cn.Close()
  69.     End Sub
  70.  
  71.     ' Create a suitable connection object for a given connection string.
  72.     Function CreateConnection(ByVal connString As String) As IDbConnection
  73.         If connString.ToLower.IndexOf("provider=") >= 0 Then
  74.             Return New OleDbConnection(connString)
  75.         Else
  76.             Return New SqlConnection(connString)
  77.         End If
  78.     End Function
  79.  
  80.     ' Create a suitable DataAdapter object for a given connection object.
  81.     Function CreateDataAdapter(ByVal sql As String, ByVal cn As IDbConnection) As DbDataAdapter
  82.         If TypeOf cn Is OleDbConnection Then
  83.             ' Create an OleDbDataAdapter and initialize its properties.
  84.             Dim da As New OleDbDataAdapter(sql, DirectCast(cn, OleDbConnection))
  85.             Dim cb As New OleDbCommandBuilder(da)
  86.             da.UpdateCommand = cb.GetUpdateCommand
  87.             da.DeleteCommand = cb.GetDeleteCommand
  88.             da.InsertCommand = cb.GetInsertCommand
  89.             Return da
  90.  
  91.         ElseIf TypeOf cn Is SqlConnection Then
  92.             ' Create an SqlDataAdapter and initialize its properties.
  93.             Dim da As New SqlDataAdapter(sql, DirectCast(cn, SqlConnection))
  94.             Dim cb As New SqlCommandBuilder(da)
  95.             da.UpdateCommand = cb.GetUpdateCommand
  96.             da.DeleteCommand = cb.GetDeleteCommand
  97.             da.InsertCommand = cb.GetInsertCommand
  98.             Return da
  99.         Else
  100.             Throw New ArgumentException()
  101.         End If
  102.     End Function
  103.  
  104.     ' A generic routine that takes an object, an event name, and a list of potential
  105.     ' delegates to event handlers, and selects the first delegate that matches the
  106.     ' expected signature of the event handler.
  107.     Sub AddHandlerByName(ByVal obj As Object, ByVal eventName As String, ByVal ParamArray events() As [Delegate])
  108.         ' Get the type of the object argument.
  109.         Dim ty As System.Type = obj.GetType
  110.         ' Get the EventInfo corresponding to the requested event
  111.         Dim evInfo As System.Reflection.EventInfo = ty.GetEvent(eventName)
  112.         ' Get the delegate class that represents the event procedure
  113.         Dim evType As System.Type = evInfo.EventHandlerType
  114.  
  115.         ' Compare this type with arguments being passed.
  116.         Dim del As [Delegate]
  117.         For Each del In events
  118.             If del.GetType Is evType Then
  119.                 ' If this is the right delegate, add it to the list of event handlers and exit.
  120.                 evInfo.AddEventHandler(obj, del)
  121.                 Exit Sub
  122.             End If
  123.         Next
  124.  
  125.     End Sub
  126.  
  127.     ' An example of two event procedure that delegate their job to a common routine.
  128.     Sub OnOleDbRowUpdated(ByVal sender As Object, ByVal e As System.Data.OleDb.OleDbRowUpdatedEventArgs)
  129.         Debug.WriteLine("OnOleDbRowUpdated")
  130.         OnRowUpdated(sender, e)
  131.     End Sub
  132.  
  133.     Sub OnSqlRowUpdated(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlRowUpdatedEventArgs)
  134.         Debug.WriteLine("SqlDbRowUpdated")
  135.         OnRowUpdated(sender, e)
  136.     End Sub
  137.  
  138.     Sub OnRowUpdated(ByVal sender As Object, ByVal e As System.Data.Common.RowUpdatedEventArgs)
  139.         ' ...
  140.     End Sub
  141.  
  142. End Module
  143.